package com.atguigu.lease.web.admin.controller.apartment;


import com.atguigu.lease.common.result.Result;
import com.atguigu.lease.model.entity.LabelInfo;
import com.atguigu.lease.model.enums.ItemType;
import com.atguigu.lease.web.admin.service.LabelInfoService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "标签管理")
@RestController
@RequestMapping("/admin/label")
public class LabelController {

    @Resource
    private LabelInfoService labelInfoService;

    /*
     * TODO:查询标签的接口
     *   1. 会遇到参数转换的问题
     *       - 当后端接受的是Param参数时且后端接受参数为String类型时，前端传来的是字符串，则不需要转换器
     *       - 当后端接受的是Param参数时且后端接受参数为其他类型时，前端传来的是字符串，则需要转换器
     *       - 因为SpringMvc提供的转换器不能完全覆盖我们的需求，所以我们需要自定义转换器
     *  2. 自定转换器的步骤
     *      - 定义一个类去实现Converter<S,T> S代表将要被转换的类型，T代表将要转换成的类型
     *      - 在类中重写convert方法，返回需要的类型
     *      - 在WebConfig类（实现了webMvcConfiguration）addFormatters方法中进行注册
     *  3. 因为这种方法需要对每一个枚举类都进行自定义的转换器，所以从而有了另外一种转换器的写法
     *      - 转换器工厂
     *      - public class StringToBaseEnumConverterFactory implements ConverterFactory<String, BaseEnum>
     * */

    @Operation(summary = "（根据类型）查询标签列表")
    @GetMapping("list")
    //@RequestParam(required = false)意思是代表参数可以选
    public Result<List<LabelInfo>> labelList(@RequestParam(required = false) ItemType type) {
        LambdaQueryWrapper<LabelInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(type != null,LabelInfo::getType,type);
        return Result.ok(labelInfoService.list(wrapper));
    }

    @Operation(summary = "新增或修改标签信息")
    @PostMapping("saveOrUpdate")
    public Result saveOrUpdateLabel(@RequestBody LabelInfo labelInfo) {
        labelInfoService.saveOrUpdate(labelInfo);
        return Result.ok();
    }

    @Operation(summary = "根据id删除标签信息")
    @DeleteMapping("deleteById")
    public Result deleteLabelById(@RequestParam Long id) {
        labelInfoService.removeById(id);
        return Result.ok();
    }
}
